/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once

#include <面/面.h>
#include <物理/物理.h>
#include <MBT_Engine.h>

#include <节点全局数据.h>



#define DEF_节点树容器槽偏移_物体 0
#define DEF_节点树容器槽偏移_几何 1
#define DEF_节点树容器槽偏移_渲染 2
#define DEF_节点树容器槽偏移_函数 3
#define DEF_节点树容器槽偏移_材质 4
#define DEF_节点树容器槽偏移_着色 5
#define DEF_节点树容器槽偏移_包 6

#define DEF_纹理容器槽_渲染输出	0
#define DEF_纹理容器槽_素材		1




typedef enum : uint32 {
	e_模型编辑_无,
	e_模型编辑_网格,
	e_模型编辑_选择,
}E_模型编辑模型;

enum E_骨骼编辑模式 : uint32 {
	e_骨架模式,
	e_编辑模式,
	e_姿态模式,
};

enum E_骨骼姿态编辑模式 : uint32 {
	e_旋转模式,
	e_拖拽模式,
};


//struct API_EXPORT S_节点数据 {
//	static std::vector<std::vector<S_MapPtrItem>*> g_节点树容器;
//	static std::vector<std::vector<S_MapPtrItem>*> g_纹理预览容器;
//
//	static std::vector<S_MapPtrItem> g_包节点树;
//	static std::vector<S_MapPtrItem> g_物体节点树;
//	static std::vector<S_MapPtrItem> g_几何节点树;
//	static std::vector<S_MapPtrItem> g_渲染节点树;
//	static std::vector<S_MapPtrItem> g_函数节点树;
//	static std::vector<S_MapPtrItem> g_材质节点树;
//	static std::vector<S_MapPtrItem> g_着色节点树;
//	static std::vector<S_MapPtrItem> g_物理节点树;
//	
//	static std::vector<S_MapPtrItem> g_渲染输出纹理;
//	static std::vector<S_MapPtrItem> g_素材纹理;
//	
//	static std::vector<C_节点树*>	g_根节点树;
//	static std::vector<C_节点树*>	g_渲染根节点树;
//	static std::map<std::wstring, E_值类型>	g_值类型名称映射;
//	static std::map<std::wstring, C_节点树*> G用于重新映射节点树到节点的容器;
//	static std::map<std::wstring, C_节点基类*> G全局节点;
//
//	
//	static C_StrKey分配器		g_节点树名称分配器;
//	static C_Key分配器			g_着色器ID分配器;
//	static C_Key分配器			G_平行光ID;
//	static C_Key分配器			G_点光源ID;
//	static C_Key分配器			G_区域光ID;
//	static C_Key分配器			G_聚光灯ID;
//
//	static S_摄像机*			g_当前操作视口相机;
//	static S_Props				g_物理引擎视口互交;
//	static vec3					g_视口鼠标点射线[2];
//	static S_施加物理力			g_施加力;
//	
//	static std::string			g_工程文件节点代码路径;
//	static std::string			g_工程文件几何节点代码绝对路径;
//	static std::string			g_工程文件函数节点代码绝对路径;
//	static std::string			g_工程文件材质节点代码绝对路径;
//	static std::string			g_工程文件着色节点代码绝对路径;
//	static std::string			g_编译器路径;
//	
//	static C_节点树* G当前包节点树;
//	static C_节点树* G当前物体节点树;
//	static C_节点树* G当前材质节点树;
//	static C_节点树* G当前着色节点树;
//	static C_节点树* G当前渲染节点树;
//	static C_节点树* G当前并行节点树;
//	static bool g_开启节点帧更新;
//	static bool g_开启节点手动更新;
//	static bool g_开启离线更新;
//	
//	static S_物体* g_激活物体;
//	static std::set<S_物体*> g_选中物体;
//	static std::set<S_物体*> m_全局物体set;
//	static std::set<S_物体*> m_独立物体set;
//	static std::set<S_物体*> g_编辑物体;
//	static std::set<S_物体*> g_辅助编辑物体;
//
//	static S_物体* m_包围盒物体;
//	static S_Mesh* g_me_摄像机锥形;
//	static S_Mesh* g_me_铰链轴;
//	static S_Mesh* g_me_立方体;
//	static S_Mesh* g_me_圆柱体;
//	static S_Mesh* g_me_球体;
//	static S_Mesh* g_me_平面;
//	static S_Mesh* g_me_胶囊;
//	static S_Mesh* g_me_链接线;
//	static S_Mesh* g_me_灯光圆;
//	static S_Mesh* g_me_灯光平行线;
//	static S_Mesh* g_me_区域光四边线;
//	static S_Mesh* g_me_十字叉;
//	static S_Mesh* g_me_范围圆;
//	static S_Mesh* g_me_胶囊封套端;
//	static S_Mesh* g_me_胶囊封套管;
//	static S_Mesh* g_me_边界框;
//	static S_Mesh* g_me_虚拟体_X箭头;
//	static S_Mesh* g_me_虚拟体_Y箭头;
//	static S_Mesh* g_me_虚拟体_Z箭头;
//	static S_Mesh* g_me_虚拟体_X旋转箭头;
//	static S_Mesh* g_me_虚拟体_Y旋转箭头;
//	static S_Mesh* g_me_虚拟体_Z旋转箭头;
//
//	static S_Mesh* g_me_物理体_立方体;
//	static S_Mesh* g_me_物理体_圆柱体;
//	static S_Mesh* g_me_物理体_球体;
//	static S_Mesh* g_me_物理体_平面;
//	static S_Mesh* g_me_物理体_胶囊;
//
//
//	static C_StrKey分配器					g_物体名称分配器;
//	static std::unordered_map<std::wstring, S_Object*>	g_全局索引物体;
//	static S_Object* g_大纲数据;
//
//	static std::map<std::wstring, S_Object*> g_渲染世界数据;
//	static C_StrKey分配器 g_渲染世界名称分配器;
//
//	static std::map<std::wstring, S_Object*> g_渲染层数据;
//	static C_StrKey分配器	g_渲染层名称分配器;
//	static C_Key分配器		g_渲染层ID生成器;
//	static S_Object*		g_渲染层大纲数据;
//	
//
//	static int32			g_物体全局渲染模式;
//	static uint32			g_物体全局显示模式;
//	static S_Prop枚举项*	g_物体显示模式项_光追;
//	static S_Prop枚举项*	g_对称轴枚举项;
//	static S_Prop枚举项*	g_图像文件后缀;
//	static S_Prop枚举项*	g_视频文件后缀;
//	static S_Prop枚举项*	g_片源着色器类型项;
//	static S_Prop枚举项*	g_粒子包含属性;
//
//
//	static int32			g_渲染帧编号;
//	static S_GPU内存块	g_小字体纹理UV;
//	static S_字体			g_字体_小;
//	static S_纹理*			g_渲染器默认纹理;
//
//	static S_GPU计算* g毛笔笔刷_计算环境;
//	static S_GPU计算* g单色纹理笔刷_计算环境;
//
//	static bool				g_开启节点更新;
//
//
//	static std::set<S_Physics*>	g_物理引擎;
//	static std::string g流体缓存类型名称;
//	static std::string g流体缓存帧ID;
//
//};





enum E_节点工程文件块类型 : uint64 {
	e_工程文件块_属性变量b = DEF_字符串拼接ID('p', 'r', 'o', 'p', 's', 'b', '\0', '\0'),


	e_工程文件块_属性变量u8 = DEF_字符串拼接ID('p', 'r', 'o', 'p', 's', 'u', '8', '\0'),
	e_工程文件块_属性变量u16 = DEF_字符串拼接ID('p', 'r', 'o', 'p', 's', 'u', '1', '6'),
	e_工程文件块_属性变量u32 = DEF_字符串拼接ID('p', 'r', 'o', 'p', 's', 'u', '3', '2'),
	e_工程文件块_属性变量u64 = DEF_字符串拼接ID('p', 'r', 'o', 'p', 's', 'u', '6', '4'),


	e_工程文件块_数组I8 = DEF_字符串拼接ID('a', 'r', 'r', 'a', 'y', 'i', '8', '\0'),
	e_工程文件块_数组I16 = DEF_字符串拼接ID('a', 'r', 'r', 'a', 'y', 'i', '1', '6'),
	e_工程文件块_数组I32 = DEF_字符串拼接ID('a', 'r', 'r', 'a', 'y', 'i', '3', '2'),
	e_工程文件块_数组I64 = DEF_字符串拼接ID('a', 'r', 'r', 'a', 'y', 'i', '6', '4'),

	e_工程文件块_数组F16 = DEF_字符串拼接ID('a', 'r', 'r', 'a', 'y', 'f', '1', '6'),
	e_工程文件块_数组F32 = DEF_字符串拼接ID('a', 'r', 'r', 'a', 'y', 'f', '3', '2'),
	e_工程文件块_数组F64 = DEF_字符串拼接ID('a', 'r', 'r', 'a', 'y', 'f', '6', '4'),

	e_工程文件块_vec2 = DEF_字符串拼接ID('v', 'e', 'c', '2', '\0', '\0', '\0', '\0'),
	e_工程文件块_vec3 = DEF_字符串拼接ID('v', 'e', 'c', '3', '\0', '\0', '\0', '\0'),
	e_工程文件块_vec4 = DEF_字符串拼接ID('v', 'e', 'c', '4', '\0', '\0', '\0', '\0'),

	e_工程文件块_数组vec2 = DEF_字符串拼接ID('v', 'e', 'c', '2', 's', 'z', '\0', '\0'),
	e_工程文件块_数组vec3 = DEF_字符串拼接ID('v', 'e', 'c', '3', 's', 'z', '\0', '\0'),
	e_工程文件块_数组vec4 = DEF_字符串拼接ID('v', 'e', 'c', '4', 's', 'z', '\0', '\0'),

	e_工程文件块_节点树 = DEF_字符串拼接ID('N', 'o', 'd', 'e', 'T', 'r', 'e', 'e'),
	e_工程文件块_节点树属性 = DEF_字符串拼接ID('N', 'T', 'P', 'r', 'o', 'p', '\0', '\0'),
	e_工程文件块_物体节点树 = DEF_字符串拼接ID('N', 'T', 'O', 'b', '\0', '\0', '\0', '\0'),
	e_工程文件块_渲染节点树 = DEF_字符串拼接ID('N', 'T', 'R', 'e', 'n', 'd', 'e', 'r'),
	e_工程文件块_节点 = DEF_字符串拼接ID('N', 'o', 'd', 'e', '\0', '\0', '\0', '\0'),
	e_工程文件块_节点实例属性 = DEF_字符串拼接ID('N', 'o', 'd', 'e', 'P', 'r', 'o', 'p'),
	e_工程文件块_插座实例属性 = DEF_字符串拼接ID('C', 'Z', 'S', 'L', '\0', '\0', '\0', '\0'),
	e_工程文件块_节点子集树 = DEF_字符串拼接ID('S', 'u', 'b', 's', 'e', 't', 'N', 'T'),
	e_工程文件块_库节点 = DEF_字符串拼接ID('N', 'o', 'd', 'e', 'L', 'i', 'b', '\0'),

	e_工程文件块_界面布局 = DEF_字符串拼接ID('U', 'I', 'L', 'a', 'y', 'o', 'u', 't'),
	e_工程文件块_工作区页面布局 = DEF_字符串拼接ID('W', 'P', 'L', '\0', '\0', '\0', '\0', '\0'),

	e_工程文件块_网格缓存 = DEF_字符串拼接ID('M', 'e', 'C', 'a', 'c', 'h', 'e', '\0'),
	e_工程文件块_数组缓存 = DEF_字符串拼接ID('A', 'r', 'r', 'a', 'y', 'B', 'u', 'f'),

	e_工程文件块_2D视口工作区状态 = DEF_字符串拼接ID('2', 'd', 'G', 'Z', 'Q', 'Z', 'T', '\0'),
	e_工程文件块_大纲视口工作区状态 = DEF_字符串拼接ID('D', 'G', '\0', '\0', '\0', '\0', '\0', '\0'),

	e_工程文件块_模型物体 = DEF_字符串拼接ID('M', 'O', 'B', '\0', '\0', '\0', '\0', '\0'),
	e_工程文件块_渲染世界 = DEF_字符串拼接ID('X', 'R', 'S', 'J', '\0', '\0', '\0', '\0'),
	e_工程文件块_多边形 = DEF_字符串拼接ID('p', 'o', 'l', 'y', '\0', '\0', '\0', '\0'),

	e_工程文件块_结束 = DEF_字符串拼接ID('E', 'n', 'd', '\0', '\0', '\0', '\0', '\0'),
};



struct S_骨骼插座数据 {
	S_物体* m_骨架;
	S_物体* m_骨节;

	std::vector<S_骨骼插座数据*> m_子骨骼;
};




API_EXPORT std::string f_nodeCtx_相对路径补全(const std::string path);
API_EXPORT std::filesystem::path f_nodeCtx_相对路径补全(const std::filesystem::path& path);



